package br.org.acessobrasil.processoacessibilidade.bo;

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.util.HashMap;

import javax.imageio.ImageIO;

import org.apache.log4j.Logger;

import br.org.acessobrasil.io.G_File;
import br.org.acessobrasil.padrao.PadraoNumerico;
import br.org.acessobrasil.processoacessibilidade.utils.FileDiff;
import br.org.acessobrasil.processoacessibilidade.vo.ArquivoPro;
import br.org.acessobrasil.processoacessibilidade.vo.JobPro;
import br.org.acessobrasil.processoacessibilidade.vo.PaginaPro;

/**
 * 
 * @author Fabio Issamu Oshiro
 *
 */
public class DesignerTemplate {
	public static final String PASTA_TEMPLATE = "templates/";
	private static HashMap<String,DesignerTemplate> mapDesigner = new HashMap<String,DesignerTemplate>();
	private JobPro job;
	private int iniciado = 0;
	private int terminado = 0;
	
	private static Logger logger = Logger.getLogger(DesignerTemplate.class);
	
	private static String extensoesImagens[] = {
		".jpg",".jpeg",".png",".gif",".bmp"
	};
	private boolean isImagem(String fileName){
		String extensao = "."+G_File.getExtensao(fileName);
		for(int i=0;i<extensoesImagens.length;i++){
			if(extensao.toLowerCase().equals(extensoesImagens[i])){
				return true;
			}
		}			
		return false;
	}
	/**
	 * SingleTon
	 * @param job
	 */
	private DesignerTemplate(JobPro job){
		this.job = job;
	}
	/**
	 * somente um designer para uma pasta
	 * @param job
	 * @return Designer responsavel pelo job
	 */
	public static DesignerTemplate getInstance(JobPro job){
		//o nome da pasta � relevante para comparar os templates
		DesignerTemplate retorno = mapDesigner.get(Arquivista.pastaDeArquivosDoSitio);
		if(retorno==null){
			retorno = new DesignerTemplate(job);
			mapDesigner.put(Arquivista.pastaDeArquivosDoSitio,retorno );
		}
		return retorno;
	}
	
	/**
	 * Descolore a imagem e salva com o final _pb.gif ou _pb.jpg, etc
	 * @param arquivo
	 */
	public synchronized void descolorirImagem(ArquivoPro arquivo,Arquivista arquivista){
		
		String basePath = Coordenador.PASTA_BASE_ARQUIVOS_CMS;
		String localFileName = basePath+arquivo.getPathLocal();
		try{
			if(!isImagem(arquivo.getPathLocal())){
				//nao descolorir
				return;
			}
			if(arquivo.getErro()!=null && !arquivo.getErro().equals("")){
				//houve algum erro
				return;
			}
			String extensao = G_File.getExtensao(arquivo.getPathLocal());
			String nome = G_File.getName(arquivo.getPathLocal());
			String nomeDir = localFileName.substring(0,localFileName.lastIndexOf(File.separatorChar));
			String nomePB = nomeDir + File.separatorChar + nome.replace("."+extensao,"_pb."+extensao);
			File filePB = new File(nomePB);
			File fileColorido = new File(localFileName);
			if(filePB.exists()){
				//j� foi convertido
				return;
			}
			if(!fileColorido.exists()){
				logger.info("baixar novamente "+ arquivo);
				arquivista.baixarNovamente(arquivo,job);
			}
			File dir = new File(nomeDir);
			if(!dir.exists()){
				dir.mkdir();
			}
			BufferedImage bi = ImageIO.read(fileColorido);
			if(bi==null){
				logger.info("baixar novamente "+ arquivo);
				arquivista.baixarNovamente(arquivo,job);
			}
			BufferedImage gray = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
			((Graphics2D) gray.getGraphics()).drawImage(bi, new AffineTransform(), null);
			ImageIO.write(gray, extensao.toLowerCase(), filePB);
			logger.debug("convertido "+nomePB);
		}catch(Exception e){
			logger.info("Arquivo: " + localFileName);
			e.printStackTrace();
		}
		
	}
	
	/**
	 * 
	 * @param pagina pagina baixada
	 */
	public void retirarTemplate(PaginaPro pagina){
		//funcionar como uma thread para liberar a avaliacao
		final File fPagina = new File(Arquivista.pastaDeArquivosDoSitio+"/"+PadraoNumerico.completarZeros(pagina.getIdPagina(),5)+".html");
		
		//sem controle de maximo de threads!
		Thread t = new Thread(){
			public void run(){
				iniciado++;
				try{
					File dir = new File(Arquivista.pastaDeArquivosDoSitio);
					String dirTemplates = Arquivista.pastaDeArquivosDoSitio+"/"+PASTA_TEMPLATE;
					File[] files = dir.listFiles(new FileFilter(){
						@Override
						public boolean accept(File file) {
							if(file.getName().endsWith(".html")) return true;
							return false;
						}
					});
					for(File file:files){
						if(file.getAbsolutePath().equals(fPagina.getAbsolutePath())) continue;
						FileDiff fileDiff = new FileDiff(fPagina.getAbsolutePath(),file.getAbsolutePath());
						String igual = fileDiff.getCodEquals();
						if(igual!=null && !igual.trim().equals("")){
							String fIgualName = fPagina.getName().replace(".html","")+"_"+file.getName();
							G_File fIgual = new G_File(dirTemplates + fIgualName);
							fIgual.write(igual);
						}
					}
				}catch(Exception e){
					e.printStackTrace();
				}finally{
					terminado++;
					logger.debug("iniciado="+iniciado+"\tterminado="+terminado+"\tfazendo="+(iniciado-terminado));
				}
			}
		};
		t.start();
		
	}
}
